# 默写迭代器和生成器的概念
# 迭代器：可迭代对象是指位置索引的序列对象；迭代器是未知长度的数据流，主要是数据上的传输，通过next()方法获取数据。
# 生成器：一种特殊的迭代器，提供惰性延迟的功能，描述的是指令上的执行。
# 使用装饰器来为斐波那契函数添加缓存


def cache_deco(func):
    def wrapper(*args, **kwargs):
        global cache
        if args in cache.keys():
            return cache[args]
        result = func(*args, **kwargs)
        cache[args] = result
        return result
    return wrapper


@cache_deco
def fibo(n):
    print("called")
    if n < 2:
        return n
    return fibo(n-1) + fibo(n-2)


if __name__ == "__main__":
    cache = {}
    print(fibo(10))
    print(fibo(10))
    print(fibo(20))